package verification;

import java.lang.reflect.Field;
import java.lang.reflect.Type;

/**
 * 实体类的数据状态验证<br/>
 * 判断数据的当前状态和预期状态是否一致<br/>
 * 或者判断数据是否有效<br/>
 * 判断实体类pojoClass对象是否为null有两层含义：
 * <p>
 * 第一层：  直接使用 pojoClass == null 去判断，对象为null的时候返回true,不为null的时候返回false。
 * <p>
 * 第二层：在pojoClass != null 为true的情况 下，进一步去判断对象的所有属性是否为null。
 *
 * @author 张峰浦
 * @create 创建时间：2020-01-17 10:33
 */
public class PojoClass {
    /**
     * 判断对象是否为空，且对象的所有属性都为空<br/>
     * boolean类型会有默认值false 判断结果不会为null 会影响判断结果<br/>
     * 序列化的默认值也会影响判断结果<p>
     * 只要有一个属性值不为null 就返回false 表示对象不为null
     *
     * @param object 待验证的实体类
     * @return 验证结果boolean;<b>为空:true,不为空:false<b/>
     */
    public static boolean pojoClassIsNull(Object object) {

        //定义返回结果，默认为true
        boolean flag = true;

        //排除极端情况
        if (object == null) {
            return flag;
        }
        // 得到类对象
        Class clazz = (Class) object.getClass();
        // 得到所有属性
        Field fields[] = clazz.getDeclaredFields();


        for (Field field : fields) {
            field.setAccessible(true);
            Object fieldValue = null;
            try {
                //得到属性值
                fieldValue = field.get(object);
                //得到属性类型
                Type fieldType = field.getGenericType();
                // 得到属性名
                String fieldName = field.getName();
                System.out.println("属性类型：" + fieldType + ",属性名：" + fieldName + ",属性值：" + fieldValue);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            //只要有一个属性值不为null 就返回false 表示对象不为null
            if (fieldValue != null) {
                flag = false;
                return flag;
            }
        }
        return flag;
    }

    /**
     * 判断对象是否为空，且对象的所有属性都不为空<br/>
     * boolean类型会有默认值false 判断结果不会为null 会影响判断结果<br/>
     * 序列化的默认值也会影响判断结果<p>
     * 只要有一个属性值为null 就返回false 表示对象属性值不全<p>
     * 可用于更新或插入前的验证
     *
     * @param object 待验证的实体类
     * @return 验证结果boolean;<b>属性值完善:true,属性值不全:false<b/>
     */
    public static boolean pojoClassIsAllNotNull(Object object) {

        //定义返回结果，默认为true
        boolean flag = true;

        //排除极端情况
        if (object == null) {
            return false;
        }

        // 得到类对象
        Class clazz = (Class) object.getClass();

        // 得到所有属性
        Field fields[] = clazz.getDeclaredFields();

        for (Field field : fields) {

            field.setAccessible(true);

            Object fieldValue = null;

            try {
                //得到属性值
                fieldValue = field.get(object);

                //得到属性类型
                Type fieldType = field.getGenericType();

                // 得到属性名
                String fieldName = field.getName();

                System.out.println("属性类型：" + fieldType + ",属性名：" + fieldName + ",属性值：" + fieldValue);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            //只要有一个属性值为null 就返回false 表示对象属性值不全
            if (fieldValue == null) {
                flag = false;
            }
        }
        return flag;
    }

}
